import { getWindows, getActiveWindow, windowWithTitle } from '@nut-tree/nut-js';
import iconv from 'iconv-lite';

/**
 * 修复 Windows 下窗口中文标题乱码问题的工具函数
 * @param {string} title - 原始标题
 * @returns {string} - 修复后的标题
 */
function fixWindowTitleEncoding(title) {
  // 检查当前操作系统是否为 Windows
  const isWindows = process.platform === 'win32';
  
  if (isWindows) {
    try {
      // 尝试使用 Buffer 进行 UTF-8 重新编码
      // 这是解决 Windows 下中文标题乱码的基本方法
      return Buffer.from(title, 'utf8').toString('utf8');
    } catch (e) {
      console.error('标题编码修复失败:', e.message);
      return title; // 修复失败时返回原始标题
    }
  }
  
  // 非 Windows 系统直接返回原始标题
  return title;
}

/**
 * 高级编码修复方法 (需要安装 iconv-lite)
 * @param {string} title - 原始标题
 * @returns {Promise<string>} - 修复后的标题
 */
async function advancedFixWindowTitleEncoding(title) {
  try {
    const buffer = Buffer.from(title, 'binary');
    return iconv.decode(buffer, 'gbk'); // 假设 Windows 窗口标题使用 GBK 编码
  } catch (e) {
    console.log('高级编码修复不可用 (请安装 iconv-lite):', e.message);
    return fixWindowTitleEncoding(title); // 回退到基本修复方法
  }
}

// 获取所有窗口并修复中文标题
const windows = await getWindows();
console.log('\n窗口列表（中文标题已修复）:');
console.log('--------------------------------------------------');

for (const currentWindow of windows) {
  try {
    const originalTitle = await currentWindow.getTitle();

    // const fixedTitle = fixWindowTitleEncoding(originalTitle);
    // console.log(`窗口标题: ${fixedTitle}`);
    
    // 可选：使用高级修复方法（取消下面的注释并安装 iconv-lite）
    if (originalTitle) {
        const advancedFixedTitle = await advancedFixWindowTitleEncoding(originalTitle);
        console.log(`高级修复后: ${advancedFixedTitle}`);
        
        console.log('--------------------------------------------------');
    }
  } catch (e) {
    console.error('获取窗口信息失败:', e.message);
  }
}

// 获取活动窗口并修复中文标题
const activeWindow = await getActiveWindow();
const originalActiveTitle = await activeWindow.title;
const fixedActiveTitle = fixWindowTitleEncoding(originalActiveTitle);
console.log(`\n活动窗口标题: ${fixedActiveTitle}`);

// 测试通过标题查找窗口
// 注意: 对于中文标题，可能需要使用修复后的标题进行查找
// 以下是一个示例，你需要根据实际情况修改中文标题
const testChineseTitle = '记事本'; // Windows 记事本默认标题

try {
  // 尝试直接查找中文标题
  let targetWindow = await windowWithTitle(testChineseTitle);
  
  if (targetWindow) {
    const targetTitle = await targetWindow.title;
    console.log(`\n成功找到中文标题窗口: ${fixWindowTitleEncoding(targetTitle)}`);
  } else {
    console.log(`\n未找到标题为 "${testChineseTitle}" 的窗口`);
    console.log('提示: 请确保有中文标题的窗口处于打开状态');
    console.log('提示: 可能需要使用编码修复后的标题进行查找');
  }
} catch (e) {
  console.error('查找窗口失败:', e.message);
}

// 导出修复函数供其他模块使用
export { fixWindowTitleEncoding, advancedFixWindowTitleEncoding };
